﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Reflection;
using System.ComponentModel;

namespace EM.General
{
    public class SQL
    {
        public DataSet DevolverDataSet(SqlConnection Cn, string SP, object objEntidad = null)
        {

            using (SqlDataAdapter dap = new SqlDataAdapter(SP, Cn))
            {
                var _with1 = dap.SelectCommand;
                _with1.CommandTimeout = 2000;
                _with1.CommandType = CommandType.StoredProcedure;
                Cn.Open();
                if ((objEntidad != null))
                    CrearParametros( dap.SelectCommand, objEntidad);
                DataSet ds = new DataSet();
                dap.Fill(ds, SP);
                Cn.Close();
                return ds;
            }
        }

        public DataRow DevolverDataRow(SqlConnection Cn, string SP, object objEntidad = null)
        {

            using (SqlDataAdapter dap = new SqlDataAdapter(SP, Cn))
            {
                var _with2 = dap.SelectCommand;
                _with2.CommandTimeout = 2000;
                _with2.CommandType = CommandType.StoredProcedure;
                Cn.Open();
                if ((objEntidad != null))
                    CrearParametros( dap.SelectCommand, objEntidad);

                DataSet ds = new DataSet();


                dap.Fill(ds, SP);

                Cn.Close();
                if (ds.Tables[0].Rows.Count > 0)
                {
                    return ds.Tables[0].Rows[0];
                }
                else
                {
                    return null;
                }

            }
        }


        public SqlDataReader DevolverDataReader(SqlConnection Cn, SqlTransaction Tx, string SP, object objEntidad = null)
        {
            SqlCommand cmd = new SqlCommand(SP, Cn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandTimeout = 2000;
            cmd.Transaction = Tx;
            Cn.Open();
            SqlDataReader dr = default(SqlDataReader);

            if ((objEntidad != null))
                CrearParametros(cmd, objEntidad);
            dr = cmd.ExecuteReader(CommandBehavior.SingleResult);
            Cn.Close();
            return dr;


        }

        public object ObtenerValorEscalar(SqlConnection Cn, SqlTransaction Tx, string SP, object objEntidad = null)
        {

            SqlCommand Cmd = new SqlCommand(SP, Cn);
            Cmd.CommandType = CommandType.StoredProcedure;
            Cmd.Transaction = Tx;
            Cmd.CommandTimeout = 2000;
            Cn.Open();
            if ((objEntidad != null))
                CrearParametros( Cmd, objEntidad);

            object Val = null;
            Val = Cmd.ExecuteScalar();
            Cn.Close();
            return Val;


        }




        public bool Mantenimiento(SqlConnection Cn, string SP, object objEntidad)
        {

            SqlCommand Cmd = new SqlCommand(SP, Cn);
            Cmd.CommandTimeout = 2000;
            Cmd.CommandType = CommandType.StoredProcedure;
            Cn.Open();

            CrearParametros( Cmd, objEntidad);

            int n = -1;

            try
            {
                n = Cmd.ExecuteNonQuery();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                Cn.Close();
            }

        }

        public bool MantenimientoConNulos(SqlConnection Cn, string SP, object objEntidad)
        {

            SqlCommand Cmd = new SqlCommand(SP, Cn);
            Cmd.CommandTimeout = 2000;
            Cmd.CommandType = CommandType.StoredProcedure;
            Cn.Open();

            CrearParametrosConNulos(ref Cmd, objEntidad);

            int n = -1;

            try
            {
                n = Cmd.ExecuteNonQuery();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                Cn.Close();
            }

        }


        private void CrearParametros(SqlCommand Cmd, object objEntidad){
	SqlCommandBuilder.DeriveParameters(Cmd);
	int I = 0;
	PropertyInfo[] propiedad = objEntidad.GetType().GetProperties();
	for (I = 0; I <= propiedad.Length - 1; I++) {
		object valor = propiedad[I].GetValue(objEntidad, null);
		DescriptionAttribute da = (DescriptionAttribute)propiedad[I].GetCustomAttributes(false)[0];
		bool valido = false;
		if ((valor != null)) {
			switch (valor.GetType().ToString()) {
				case "System.String":
					valido = !string.IsNullOrEmpty(Convert.ToString(valor));
					break;
				case "System.Int8":
				case "System.Int16":
				case "System.Int32":
				case "System.Decimal":
					valido = Convert.ToInt32(valor) != -1;
					break;
				case "System.DateTime":
					//#12:00:00 AM# es el dato asignado por defecto a una variable datetime cuando no se le asigna un valor
					//valido = Convert.ToInt32(valor) != 01/01/0001 00:00:00;
					break;
				case "System.Date":
					//#12:00:00 AM# es el dato asignado por defecto a una variable datetime cuando no se le asigna un valor
					//valido = Convert.ToInt32(valor) != 01/01/0001 00:00:00;
					break;
			}
		} else {
			valido = false;
		}

		if (valido == true) {
			Cmd.Parameters["@" + da.Description].Value = valor;

		}
	}
}


        private void CrearParametrosConNulos(ref SqlCommand Cmd, object objEntidad)
{
	SqlCommandBuilder.DeriveParameters(Cmd);
	int I = 0;
	PropertyInfo[] propiedad = objEntidad.GetType().GetProperties();
	for (I = 0; I <= propiedad.Length - 1; I++) {
		object valor = propiedad[I].GetValue(objEntidad, null);
		DescriptionAttribute da = (DescriptionAttribute) propiedad[I].GetCustomAttributes(false)[0];
		if ((valor != null)) {
			switch (valor.GetType().ToString()) {
				case "System.String":
					if (string.IsNullOrEmpty(Convert.ToString(valor)))
						valor = DBNull.Value;
					break;
				case "System.Int8":
				case "System.Int16":
				case "System.Int32":
				case "System.Decimal":
					if (Convert.ToInt32(valor) == -1)
						valor = DBNull.Value;
					break;
				case "System.DateTime":
					//#12:00:00 AM# es el dato asignado por defecto a una variable datetime cuando no se le asigna un valor
                    //if (valor == 01/01/0001 00:00:00)
                    //    valor = DBNull.Value;
                    break;
				case "System.Date":
					//#12:00:00 AM# es el dato asignado por defecto a una variable datetime cuando no se le asigna un valor
                    //if (valor == 01/01/0001 00:00:00)
                    //    valor = DBNull.Value;
                    break;
			}
		} else {
			valor = DBNull.Value;
		}

		Cmd.Parameters["@" + da.Description].Value = valor;

	}
}
    }

}
